package cn.itsource.controller;

import cn.itsource.dto.SmsSendDto;
import cn.itsource.exception.MyException;
import cn.itsource.result.JSONResult;
import cn.itsource.utils.MyTools;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.concurrent.TimeUnit;

/**
 * <p>描述</p>
 *
 * @author 波波老师(微信 ： javabobo0513)
 * @date 2022/11/18-10:19
 */
@RestController
@RequestMapping("/verifycode")
public class VerifycodeController {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 发送短信验证码的接口
     * @return
     */
    @PostMapping("/sendSmsCode")
    public JSONResult sndSmsCode(@RequestBody SmsSendDto dto){
        /**
         * 1、入参校验
         * 2、判断用户输入的图片验证码是否正确（根据UUID区Redis查询正确的验证码内容和用户输入的做对比）
         * 3、查询数据库看手机号是否已经存在
         * 4、如果正确，给手机号发短信即可，并将验证码存Redis，手机号作为key
         */

        //2、判断用户输入的图片验证码是否正确
        String codeFromRedis = (String)redisTemplate.opsForValue().get(dto.getImageCodeKey());
        if(!StringUtils.hasLength(codeFromRedis)){
            throw new MyException("验证码过期，请刷新页面重试！");
        }
        if(!codeFromRedis.equals(dto.getImageCode())){
            throw new MyException("验证码错误，请重新输入！");
        }
        //发送短信验证码
        String code = MyTools.getRandomNum(6);
        System.out.println("发送短信验证码=" + code);

        //存Redis
        redisTemplate.opsForValue().set(dto.getMobile(), code, 5, TimeUnit.MINUTES);

        return JSONResult.success();
    }

    /**
     * 注册时，页面获取图片验证码接口
     * @param code 前端传来的UUID
     * @return
     */
    @GetMapping("/imageCode/{code}")
    public JSONResult imageCode(@PathVariable("code") String code){
        /**
         * 1、前端发请求给后台
         * 2、生成图片，图片上需要水印随机4位数
         * 3、将图片的Base64数据返回给前端
         * 4、前端拿到Base64数据后，用img标签包裹
         */
        if(!StringUtils.hasLength(code)){
            throw new MyException("UUID不能为空");
        }

        SpecCaptcha specCaptcha = new SpecCaptcha(130, 35, 4);
        //设置验证码的类型（可不设置，使用默认值）
        specCaptcha.setCharType(Captcha.TYPE_ONLY_NUMBER);
        //图片验证码中的随机内容
        String codeRandom = specCaptcha.text();

        //图片验证码存Redis
        redisTemplate.opsForValue().set(code, codeRandom, 60, TimeUnit.SECONDS);

        //返回图片验证码的Base64数据给前端
        return JSONResult.success(specCaptcha.toBase64());
    }
}
